<?php
/**
 * Describe:基础控制器
 * Source:
 * User: blue
 * Time: 2018/1/28 15:39
 */

namespace app\common\controller;
use think\Lang;
// use think\Model;
use think\Request;
use think\Session;
use think\Validate;


class Base
{
    protected $model;
    protected $modelName;
    Protected $request;
    protected $pk;
    //控制器前置操作预留

    //类里面引入jump类
    use \traits\controller\Jump;

    public function __construct()
    {
        // 初始化成员属性
        if($this->modelName) $this->model=model($this->modelName);
        if(!$this->request) $this->request=Request::instance();
        $this->pk=isset($this->pk)?$this->pk:"id";
    //    判断是否登录
        $this->isLogin();
    //    权限判断
        $this->checkAuth();
    }
    //是否登录
    public function isLogin(){
        if(!Session::get('name')){
            $this->error('您没有登录','auth/login/login');
        }
        //判断登录状态是否过期
        if (isset($_SESSION['think']['expire'])){
            //如果expire时间<当前时间,删除sesion,并且登出
            if(Session::get('expire')<time()){
                Session::delete('expire');
                Session::delete('name');
                Session::delete('id');
                $this->success('用户超时','auth/login/login');
            }
            //否则,更新expire时间
            Session::set('expire',time()+3600);
        }
    }
    /**
     * 权限检测方法
     */
    public function checkAuth(){
        $rule=\request()->module().'/'.\request()->controller().'/'.\request()->action();
        /*auth类基本权限判断
        附加规则auth表中condition设置{score}>50 and {score}<100 其中score必须和用户表字段一致*/
        $res=(new \think\auth\Auth())->check($rule,session('id'));
        if(!$res){
            $this->error('没有操作权限');
        }
    }
    /**
     * 验证器验证
     * @param 验证器名称
     * @param 数据
     * @param string '' 验证场景
     * @param array 参数主要用于直接使用Validate类的时候
     * @return array
     */
    protected function validation($validateName,$data,$scence='',$param=[]){
        $validate=empty($params)?new $validateName():new $validateName($param);
        if(empty($scence)){$res=$validate->batch()->check($data);}
        else{$res=$validate->scene($scence)->batch()->check($data);}
        if(!$res){
            $msg=json_encode($validate->getError(),JSON_UNESCAPED_UNICODE);
            return ['status'=>0,'msg'=>$msg];
        }
        return ['status'=>1,'msg'=>'数据验证成功'];
    }
    /**
     * [ FiledCover 表单字段和数据库字段的转换,多维数组需要重写
     * @param array $data 需要处理的字段
     * @param  array  $array [键名为数据库字段,键值为表单字段]
     * @return array 处理后的数据
     */
    protected  function filedCover($data,$array=[]){
        if(is_array($array)&&!empty($array)){
            foreach ($array as $key => $value) {
                $data[$value]=$data[$key];
                unset($data[$key]);
            }
        }
        return $data;
    }

    /**
     * 查找一条旧数据
     */
    protected function getOneOld(){
        $where[$this->pk]=intval($this->request->param('id'));
        $oldData=$this->model->show($where);
        isset($oldData['data'])&& View::share('oldData',$oldData['data'][0]);
    }
    /**
     *查找模型的
     */
    protected function tableSelect($model){
        if($model instanceof \think\Model){
            $data=$model->select();
        }
        return $data;
    }

}